package ar.uba.fi.tonyvaliente.compresion;

import java.util.ArrayList;
import java.util.BitSet;
import java.util.LinkedList;
import java.util.List;

/**
 * Utilidades para compresión
 * 
 * @author santiago
 * 
 */
public class CompresionUtil {

	/**
	 * Convierte un número a su codificación gamma
	 * 
	 * @param original
	 *            el número a convertir
	 * @return los bits que representan la codificación gamma del número
	 */
	public static BitSet obtenerGamma(int original) {
		BitSet gamma = new BitSet();
		System.out.println(Integer.toBinaryString(original));
		return gamma;
	}

	/**
	 * Convierte un número codificado en gamma a entero en base 10.
	 * 
	 * @param gamma
	 *            los bits a decodificar
	 * @return el número representado por los bits de <code>gamma</code>
	 */
	public static int obtenerEntero(BitSet gamma) {
		return 0;
	}

	/**
	 * Dada una lista de punteros (enteros), ordenada de menor a mayor, devuelve
	 * una lista de distancias entre cada uno de sus elementos.
	 * 
	 * @param listaPunteros
	 * @return
	 */
	public static List<Integer> obtenerListaDistancias(
			List<Integer> listaPunteros) {
		int anterior = 0;
		List<Integer> distancias = new ArrayList<Integer>();

		for (Integer puntero : listaPunteros) {
			int distancia = puntero - anterior;
			anterior = puntero;
			distancias.add(distancia);
		}

		return distancias;
	}

	/**
	 * Dada una lista de distancias devuelve los enteros representados en ella.
	 * 
	 * @param listaDistancias
	 * @return
	 */
	public static List<Integer> obtenerListaPunteros(
			List<Integer> listaDistancias) {
		int anterior = 0;
		List<Integer> punteros = new ArrayList<Integer>();

		for (Integer distancia : listaDistancias) {
			int puntero = distancia + anterior;
			anterior = puntero;
			punteros.add(puntero);
		}

		return punteros;
	}

	

	public static void main(String[] args) {
		List<Integer> distancias = new ArrayList<Integer>();
		distancias.add(3);
		distancias.add(2);
		distancias.add(18);
		distancias.add(8);
		distancias.add(47);
		distancias.add(4);
		distancias.add(1);
		System.out.println("Distancias: " + distancias);
		List<Integer> punteros = obtenerListaPunteros(distancias);
		System.out.println("Punteros: " + punteros);
		System.out.println("Distancias again: "
				+ obtenerListaDistancias(punteros));

		for (int i = 0; i < 20; i++) {
			obtenerGamma(i);
		}
		
		/*
		int[] decimals1 = { 129, 42, 37 };
		byte[] delta = toDelta(decimals1);
		int[] decimals2 = fromDelta(delta);
		for(int i = 0; i < decimals2.length; i++)
		{
			System.out.print(decimals2[i]);
			System.out.print(", ");
		}
		 */
	}
}
